package com.hb.impl;

import com.hb.interfaces.AutowiredTest;
import com.hb.interfaces.CompactDisc;
import com.hb.interfaces.MediaPlayer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.inject.Inject;

@Component
public class CDPlayer implements MediaPlayer {
    // @Autowired 也可以用在类的私有成员上
    @Autowired
    private CompactDisc cd;

    @Autowired
    public CDPlayer(CompactDisc cd) {
        this.cd = cd;
    }

    // @Autowired 注解不仅能够用在构造器上，还能用在属性的 Setter 方法上
    @Autowired
    public void setCompactDisc(CompactDisc cd) {
        this.cd = cd;
    }

    // @Autowired 可以用在类的任何方法上
    // 将 required 属性设置为 false 时，Spring 会尝试执行自动装配，但是如果没有匹配的 bean 的话，Spring 将会让这个 bean 处于未装配的状态。
    @Autowired(required = false)
    public void insertDisc(CompactDisc cd) {
        this.cd = cd;
    }

    // 1、@Autowired 是 Spring 特有的注解。如果你不愿意在代码中到处使用 Spring 的特定注解来完成自动装配任务的话，那么你可以考虑将其替换为 @Inject
    // 2、@Inject 注解来源于 Java 依赖注入规范，该规范同时还为我们定义了 @Named 注解。在自动装配中，Spring 同时支持 @Inject 和 @Autowired。
    // 3、尽管 @Inject 和 @Autowired 之间有着一些细微的差别，但是在大多数场景下，它们都是可以互相替换的。
    @Inject
    public void userInjectAnnotation(CompactDisc cd) {
        this.cd = cd;
    }

    @Override
    public void play() {
        cd.play();
    }
}
